package com.simple.datax.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * @Title: MessageZIP.java
 * @Package com.simple.datax.utils
 * @Description: ZIP压缩解压类
 * @author Paladin Chen
 * @date 2013-1-7 下午9:14:53
 * @version V1.0
 */
public class MessageZIP {
	private static String encode = "utf-8";// "ISO-8859-1"

	public String getEncode() {
		return encode;
	}

	/**
	 * 设置 编码，默认编码：UTF-8
	 */
	public void setEncode(String encode) {
		MessageZIP.encode = encode;
	}

	/**
	 * 字符串压缩为字节数组
	 */
	public static byte[] compressToByte(String str) throws Exception {
		return compressToByte(str, encode);
	}

	/**
	 * 字符串压缩为字节数组
	 */
	public static byte[] compressToByte(String str, String encoding) throws Exception {
		if (str == null || str.length() == 0) {
			return null;
		}

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ZipOutputStream zip;
		try {
			zip = new ZipOutputStream(out);
			ZipEntry entry = new ZipEntry("zip");
			byte[] data = str.getBytes(encoding);
			entry.setSize(data.length);
			zip.putNextEntry(entry);
			zip.write(data);
			zip.closeEntry();
			zip.close();
			byte[] ret = out.toByteArray();
			out.close();
			return ret;
		} catch (IOException e) {
			// e.printStackTrace();
			throw e;
		}
	}

	/**
	 * 字节数组解压缩后返回字符串
	 */
	public static String uncompressToString(byte[] b) throws Exception {
		return uncompressToString(b, encode);
	}

	/**
	 * 字节数组解压缩后返回字符串
	 */
	public static String uncompressToString(byte[] b, String encoding) throws Exception {
		if (b == null || b.length == 0) {
			return null;
		}

		// ByteArrayOutputStream out = new ByteArrayOutputStream();
		ByteArrayInputStream in = new ByteArrayInputStream(b);
		String ret = "";
		try {
			ZipInputStream gunzip = new ZipInputStream(in);
			// byte[] buffer = new byte[256];
			// int n;
			//
			// while ((n = gunzip.read(buffer)) >= 0) {
			// out.write(buffer, 0, n);
			// }

			while (gunzip.getNextEntry() != null) {
				byte[] buf = new byte[1024];
				int num = -1;
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				while ((num = gunzip.read(buf, 0, buf.length)) != -1) {
					baos.write(buf, 0, num);
				}
				ret = ret + baos.toString(encoding);
				baos.flush();
				baos.close();
			}
			
			gunzip.close();
			in.close();

			return ret;
		} catch (IOException e) {
			// e.printStackTrace();
			throw e;
		}
	}
}
